package design.graduation.novelsystem.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import design.graduation.novelsystem.constant.Constant;
import design.graduation.novelsystem.mapper.RoleMapper;
import design.graduation.novelsystem.model.domian.Role;
import design.graduation.novelsystem.model.dto.DataGridView;
import design.graduation.novelsystem.model.vo.RoleVo;
import design.graduation.novelsystem.service.RoleService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * @author: 洪少尉
 * @Date: 2020/4/14 02:54
 * @Description: 
 */
@Service
public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements RoleService{
	@Autowired
	private RoleMapper roleMapper;
	/**
	 * 根据管理员id查询拥有的角色名称
	 * 用于赋予ActiveAdmin的角色信息
	 * @param adminId 管理员id
	 * @return 角色名称集合
	 */
	@Override
	public List<String> queryRoleNamesByAdminId(Integer adminId) {
		//根据用户ID查询角色ID的集合
		List<Integer> roleIds=this.baseMapper.queryRoleIdsByAdminId(adminId);
		if( null !=roleIds && roleIds.size()>0){
			QueryWrapper<Role> queryWrapper=new QueryWrapper<>();
			queryWrapper.eq(Role.COL_AVAILABLE, Constant.AVAILABLE_TRUE)
					.in(Role.COL_ID,roleIds);
			// 查出所有角色
			List<Role> rolesObject=this.roleMapper.selectList(queryWrapper);
			List<String> roles=new ArrayList<>();
			//取出所有角色名称
			for (Role role : rolesObject) {
				roles.add(role.getName());
			}
			return roles;
		}
		return null;
	}

	/**
	 * 用于角色管理表单数据
	 *
	 * @param roleVo 查询条件
	 * @return 全部角色数据
	 */
	@Override
	public DataGridView queryAllRole(RoleVo roleVo) {
		IPage<Role> page=new Page<>(roleVo.getPage(),roleVo.getLimit());
		QueryWrapper<Role> queryWrapper=new QueryWrapper<>();
		queryWrapper.eq(roleVo.getAvailable()!=null,Role.COL_AVAILABLE,roleVo.getAvailable())
				.like(StringUtils.isNotBlank(roleVo.getName()),Role.COL_NAME,roleVo.getName())
				.like(StringUtils.isNotBlank(roleVo.getRemark()),Role.COL_REMARK,roleVo.getRemark());
		this.roleMapper.selectPage(page,queryWrapper);
		return new DataGridView(page.getTotal(),page.getRecords());
	}

	/**
	 * 保存角色
	 *
	 * @param role 角色信息
	 * @return true/false
	 */
	@Override
	public boolean saveRole(Role role) {
		role.setAvailable(Constant.AVAILABLE_TRUE)
				.setCreateTime(new Date())
				.setEditTime(new Date());
		return this.save(role);
	}

	/**
	 * 更新角色
	 *
	 * @param role 角色信息
	 * @return true/false
	 */
	@Override
	public boolean updateRole(Role role) {
		role.setEditTime(new Date());
		return this.updateById(role);
	}

	/**
	 * 查询所有可用角色
	 *同时对选中管理者所拥有的角色进行反选
	 * @param roleVo 角色信息
	 * @return 角色
	 */
	@Override
	public DataGridView queryAllAvailableRoleNoPage(RoleVo roleVo) {
		QueryWrapper<Role> queryWrapper=new QueryWrapper<>();
		queryWrapper.eq(Role.COL_AVAILABLE,Constant.AVAILABLE_TRUE);
		List<Role> roles = this.roleMapper.selectList(queryWrapper);
		//根据用户ID查询已拥有的角色ID
		List<Integer> roleIds=this.roleMapper.queryRoleIdsByAdminId(roleVo.getAdminId());
		List<Map<String,Object>> lists=new ArrayList<>();
		//遍历所有可用角色
		for (Role role : roles) {
			boolean LAY_CHECKED=false;
			//遍历已拥有的角色ID
			for (Integer roleId : roleIds) {
				//可用角色 == 用户拥有角色
				if(role.getId().equals(roleId)){
					//则前端页面反选
					LAY_CHECKED=true;
					break;
				}
			}
			Map<String,Object> map=new HashMap<>();
			map.put("id",role.getId());
			map.put("name",role.getName());
			map.put("remark",role.getRemark());
			map.put("LAY_CHECKED",LAY_CHECKED);
			lists.add(map);
		}
		return new DataGridView((long) lists.size(),lists);
	}

	/**
	 * 根据角色ID查询角色拥有的菜单和权限ID
	 *
	 * @param id 角色id
	 * @return 角色拥有的菜单和权限ID
	 */
	@Override
	public List<Integer> queryMenuIdsByRid(Integer id) {
		return this.roleMapper.queryMenuIdsByRid(id);
	}

	/**
	 * 保存角色的菜单权限
	 * 有删除和添加菜单权限的功能
	 * @param rid  角色id
	 * @param mids 菜单id集合
	 * @return true/false
	 */
	@Override
	public boolean saveRoleMenu(Integer rid, Integer[] mids) {
		//1.先删除拥有的所有权限
		boolean mark = this.roleMapper.deleteRoleMenuByRid(rid);
		if(null!= mids && mids.length>0){
			for (Integer mid : mids) {
				//2.添加权限
				mark = this.roleMapper.insertRoleMenu(rid,mid);
			}
		}
		return mark;
	}
}
